package com.sud.config.persistence;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能：分页对象
 * 作者：SUD
 * 时间：2020/9/7 14:34
 */
@ApiModel(description="分页对象")
public class Page<T> implements Serializable {
    @ApiModelProperty(value = "当前页码")
    private int pageNo = 1; // 当前页码

    @ApiModelProperty(value = "页面大小")
    @Value("${page.pageSize:20}")
    private int pageSize; // 页面大小，设置为“-1”表示不进行分页（分页无效）

    @ApiModelProperty(value = "总记录数")
    private long count;// 总记录数，设置为“-1”表示不查询总数

    @ApiModelProperty(value = "录数集合")
    private List<T> list = new ArrayList<T>();
    @ApiModelProperty(value = "排序字段")
    private String orderBy; // 标准查询有效， 实例： updatedate desc, name asc

    /**
     * 构造方法
     * @param request 传递 repage 参数，来记住页码
     */
    public Page(HttpServletRequest request){
        // 设置页码参数（传递repage参数，来记住页码）
        String no = request.getParameter("pageNo");
        if(StringUtils.isEmpty(no)){
            this.setPageNo(1);
        }else{
            try {
                this.setPageNo(Integer.parseInt(no));
            }catch (Exception e){
                this.setPageNo(1);
            }
        }
        // 设置页面大小参数（传递repage参数，来记住页码大小）
        String size = request.getParameter("pageSize");
        if(!StringUtils.isEmpty(size)){
            try {
                this.setPageSize(Integer.parseInt(size));
            }catch (Exception e){
                this.setPageNo(1);
            }
        }
        // 设置排序参数
        String orderBy = request.getParameter("orderBy");
        if (!StringUtils.isEmpty(orderBy)){
            this.setOrderBy(orderBy);
        }
    }

    /**
     * 构造方法
     * @param pageNo 当前页码
     * @param pageSize 分页大小
     */
    public Page(int pageNo, int pageSize) {
        this(pageNo, pageSize, 0);
    }

    /**
     * 构造方法
     * @param pageNo 当前页码
     * @param pageSize 分页大小
     * @param count 数据条数
     */
    public Page(int pageNo, int pageSize, long count) {
        this(pageNo, pageSize, count, new ArrayList<T>());
    }

    /**
     * 构造方法
     * @param pageNo 当前页码
     * @param pageSize 分页大小
     * @param count 数据条数
     * @param list 本页数据对象列表
     */
    public Page(int pageNo, int pageSize, long count, List<T> list) {
        this.setCount(count);
        this.setPageNo(pageNo);
        this.pageSize = pageSize;
        this.list = list;
    }

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public long getCount() {
        return count;
    }

    public void setCount(long count) {
        this.count = count;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public String getOrderBy() {
        return orderBy;
    }

    public void setOrderBy(String orderBy) {
        this.orderBy = orderBy;
    }
    /**
     * 获取 Hibernate FirstResult
     */
    @JsonIgnore
    public int getFirstResult(){
        int firstResult = (getPageNo() - 1) * getPageSize();
        if (firstResult >= getCount()) {
            firstResult = 0;
        }
        return firstResult;
    }
    /**
     * 获取 Hibernate MaxResults
     */
    @JsonIgnore
    public int getMaxResults(){
        return getPageSize();
    }
}
